/*!
 * 文件名称： main.c
 * 描    述： UART-DMA串口不定长收发实验主函数文件
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "gd32f30x.h"
#include <stdio.h>
#include "bsp_led.h"
#include "bsp_uart.h"
#include "driver_public.h"
//#include "rcu_ckout_drv.h"

uint8_t uart_rec_buff[100];
uint8_t uart_send_buff[100];

bit_status uart_receive_complete_flag=RESET;
uint16_t uart_receive_count=0;

/*!
* 说明     usart接受完成回调，在串口IDLE中断回调执行
* 输入[1]  自动调用
* 返回值   无
*/
void user_receive_complete_callback(typdef_uart_struct *uartx)
{   
    //记录接受长度和接受完成标志
    uart_receive_count=BOARD_UART.uart_control.RecCount; 
    uart_receive_complete_flag=SET;
    
    //搬运接受到的数据进行处理，接受buff可继续接受数据
    memcpy(uart_send_buff,BOARD_UART.uart_control.p_Rec,BOARD_UART.uart_control.RecCount);
    
    //重新配置接受，最长100byte
    driver_uart_dma_receive(&BOARD_UART,uart_rec_buff,100);      
    
    //翻转LED表示接受完成   
    bsp_led_toggle(&LED0);
    bsp_led_toggle(&LED1);      
}

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
int main(void)
{   
    //延时、共用驱动部分初始化
    driver_init(); 

    //初始化UART为DMA模式，注册接受完成（IDLE）回调函数
    BOARD_UART.uart_mode_tx=MODE_DMA;
    BOARD_UART.uart_mode_rx=MODE_DMA;
    BOARD_UART.uart_idle_callback=user_receive_complete_callback;       
    bsp_uart_init(&BOARD_UART);

    bsp_led_init(&LED0);     
    bsp_led_init(&LED1); 
    bsp_led_on(&LED0);
    bsp_led_off(&LED1);    

    //使能UART中断
    nvic_irq_enable(USART0_IRQn,2,0); 

    delay_ms(200);
    printf_log("uart dma mode sends and receives loopback packets of indefinite length.\r\n"); 

    //启动UART dma接受，最长100byte
    driver_uart_dma_receive(&BOARD_UART,uart_rec_buff,100);
    
	while (1)
	{
        //查询到接受完成回调函数标志
        if(uart_receive_complete_flag==SET)
        {
            uart_receive_complete_flag=RESET;
            
            //dma方式发送刚接受到的数据
            driver_uart_dma_transmit(&BOARD_UART,uart_send_buff,uart_receive_count);    
            bsp_lcd_printf("%s",uart_send_buff);            
            
        }
	}
}







